package fr.auzaiphe.admin.model;

import java.util.ArrayList;

/**
 * 
 * @author Hugp
 * Historique de découverte des indices par les joueurs.
 *
 */
public class Historique
{
	private ArrayList<Evenement> listeEvenements;
	
	/**
	 * Constructeur
	 */
	public Historique()
	{
		this.listeEvenements = new ArrayList<Evenement>();
	}
	
	/**
	 * @return Recupere la liste des notifications, la fonction toString() sur les evenements
	 * 		   retourne la String a afficher directement dans les notifications, selon le type d'evenement.
	 * 		   La couleur enfin donne la couleur d'affichage du type d'evenement.  
	 */
	public ArrayList<Evenement> getListeEvenements()
	{
		return this.listeEvenements;
	}
	
	/**
	 * Ajout d'un evtAlerte dans la liste des notifications
	 * @param pDate Heure de l'evenement
	 * @param pCouleur Couleur d'affichage de l'evenement
	 * @param pAlerte Alerte declenchée
	 * @return true si l'alerte n'était pas déjà dans les notification, false sinon.
	 */
	public boolean addEvtAlerte(int pDate,
								String pCouleur,
								Alerte pAlerte)
	{
		EvtAlerte evalt = new EvtAlerte(pDate,pCouleur,pAlerte);
		for(Evenement evt : this.listeEvenements)
			if(evt instanceof EvtAlerte && evt.equals(evalt))
				return false;
		this.listeEvenements.add(evalt);
		return true;
	}
	
	/**
	 * Ajout d'un EvtConnexionJoueur dans la liste des notifications.
	 * @param pDate Heure de la connexion du joueur
	 * @param pCouleur Couleur d'afficha ge de al notification
	 * @param pJoueur Joueu s'étant connecté.
	 * @return false si l'evenement n'etait pas déjà dans la liste, true sinon.
	 */
	public boolean addEvtConnexionJoueur(int pDate, 
										 String pCouleur, 
										 Joueur pJoueur)
	{
		EvtConnexionJoueur evCJ	= new EvtConnexionJoueur(pDate, pCouleur, pJoueur);
		for(Evenement evt : this.listeEvenements)
			if(evt instanceof EvtConnexionJoueur && evt.equals(evCJ))
				return false;
		this.listeEvenements.add(evCJ);
		return true;
	}
	
	/**
	 * Ajout d'un EvtDeconnexionJoueur dans la liste de notifications.
	 * @param pDate Heure de deconnexion du joueur
	 * @param pCouleur Couleur d'affichage de la notification
	 * @param pJoueur Joueur s'étant déconnecté.
	 * @return false si l'evenement n'etait pas déjà dans la liste, true sinon.
	 */
	public boolean addEvtDeconnexionJoueur(int pDate,
										   String pCouleur,
										   Joueur pJoueur)
	{
		EvtDeconnexionJoueur evDJ = new EvtDeconnexionJoueur(pDate, pCouleur, pJoueur);
		for(Evenement evt : this.listeEvenements)
			if(evt instanceof EvtDeconnexionJoueur && evt.equals(evDJ))
				return false;
		this.listeEvenements.add(evDJ);
		return true;
	}
	
	/**
	 * Ajout d'un evtDecouverteIndice dans la liste des notifications
	 * @param pDate Heure de découverte de 'lindice
	 * @param pCouleur Couleur d'affichage de al notification
	 * @param pJoueur Joueur ayant découvert l'indice
	 * @param pIndice Indice découvert par le joueur
	 * @return true 
	 */
	public boolean addEvtDecouverteIndice(int pDate,
									   String pCouleur,
									   Joueur pJoueur,
									   Indice pIndice)
	{
		EvtDecouverteIndice evDI = new EvtDecouverteIndice(pDate,pCouleur,pJoueur, pIndice);
		for(Evenement evt : this.listeEvenements)
			if(evt instanceof EvtDecouverteIndice && evt.equals(evDI))
				return false;
		this.listeEvenements.add(evDI);
		return false;
	}
	
	/**
	 * Ajout d'un evtEchangeTemps dans la liste des notifications.
	 * @param pDate Heure de demande d'echange
	 * @param pCouleur Couleur d'affichage de la notification
	 * @param pDonneur Joueur donneur de temps
	 * @param pReceveur Joueur receveur de temps
	 * @param pMontant Montant de la transaction.
	 * @return false si l'evenement n'etait pas déjà dans la liste, false sinon.
	 */
	public boolean addEvtEchangeTemps(int pDate,
									  String pCouleur, 
									  Joueur pDonneur, 
									  Joueur pReceveur, 
									  int pMontant)
	{
		EvtEchangeTemps evET = new EvtEchangeTemps(pDate, pCouleur, pDonneur, pReceveur, pMontant);
		for(Evenement evt : this.listeEvenements)
			if(evt instanceof EvtEchangeTemps && evt.equals(evET))
				return false;
		this.listeEvenements.add(evET);
		return true;
		
	}
	
	/**
	 * Ajoute un EvtIndiceOn dans la liste des notifications.
	 * @param pDate Heure d'activation de l'indice
	 * @param pCouleur Couleur d'affichage de la notification
	 * @param pIndice Indice activé.
	 * @return false si l'evenement n'etait pas déjà dans la liste, true sinon.
	 */
	public boolean addEvtIndiceOn(int pDate,String pCouleur,Indice pIndice)
	{
		EvtIndiceOn evIOn = new EvtIndiceOn(pDate, pCouleur, pIndice);
		for(Evenement evt : this.listeEvenements)
			if(evt instanceof EvtIndiceOn && evt.equals(evIOn))
				return false;
		this.listeEvenements.add(evIOn);
		return true;
	}
	
	/**
	 * Ajoute un EvtIndiceOff dans la liste des notifications.
	 * @param pDate Heure de désactivation de l'indice
	 * @param pCouleur Couleur d'affichage de la notification
	 * @param pIndice Indice désactivé.
	 * @return false si l'evenement n'était pas déjà dans la liste, true sinon.
	 */
	public boolean addEvtIndiceOff(int pDate,String pCouleur,Indice pIndice)
	{
		EvtIndiceOff evIOff = new EvtIndiceOff(pDate, pCouleur, pIndice);
		for(Evenement evt : this.listeEvenements)
			if(evt instanceof EvtIndiceOff && evt.equals(evIOff))
				return false;
		this.listeEvenements.add(evIOff);
		return true;
	}
	
	/**
	 * Vidage de la liste des notifications. =D
	 */
	public void vider()
	{
		this.listeEvenements = new ArrayList<Evenement>();
	}
	
	public void clone(Historique pHistorique)
	{
		
	}
}
